مشخصات مقاله
-
1291
-
0.0
-
2969
-
0
-
0
آموزش ویژگی های C# که امکان پشتیبانی از LINQ را فراهم می آورند
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
قابلیت و ویژگی های C# که امکان پشتیبانی از LINQ را فراهم می آورند
بخش زیر ساختارهای جدیدی را معرفی می کند که برای اولین بار در ویرایش 3.0 زبان C# رونمایی شدند. اگرچه تمامی ساختارهای زیر تا اندازه ای برای تنظیم و نوشتن کوئری های LINQ مورد استفاده قرار می گیرند، اما فقط محدود به آن نبوده و در هر بستر دیگری که می توانند مفید واقع شوند، قابل بکار گیری می باشند.
عبارت های Query (Query Expressions)
عبارت های Query از یک ساختار اعلانی مشابه SQL یا XQuery to query برای کوئری گرفتن از IEnumerable استفاده می کند (ساختار اعلانی: در آن منطق و هدف محاسبات بدون شرح چگونگی انجام آنها بیان میشود.) در زمان کامپایل کوئری که با ساختار نگارشی Query Syntax نوشته شده برای اجرا به method syntax تبدیل می شود (کوئری به صورتmethod extension هایی که در واقع همان عملگرهای متعارف SQL هستند درآمده و یکی پس از دیگری فراخوانی می شوند). برنامه ی جاری به واسطه ی دستور using کتابخانه ای (همان namespace) که عملگرها و توابع SQL در آن ذخیره شده اند را وارد کرده و از عملگرهای مزبور در حوزه ی (scope) خود استفاده می کند. عبارت کوئری زیر آرایه ای از رشته ها را بازیابی کرده و آن ها را به وسیله ی دستور group …by بر اساس کاراکتر اول هر رشته گروه بندی می کند. پس از آن گروه ها را به وسیله ی عملگر orderby مرتب می کند.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
متغیرهایی که به صورت ضمنی نوع دهی می شوند (کلیدواژه ی var)
بجای اینکه نوع متغیری را در زمان اعلان یا تعریف آن به طور صریح مشخص کنید، می توانید از واژه ی کلیدی var استفاده نمایید. کلیدواژه ی نام برده در حقیقت به کامپایلر دستور می دهد که نوع متغیر را خود تشخیص یا به آن تخصیص دهد:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str
متغیرهایی که به وسیله ی کلیدواژه ی var تعریف می شوند دقیقا به میزان متغیرهایی که نوع آن ها به صورت صریح مشخص می شود، وابسته به نوع و strongly-typed می باشند. استفاده از var این امکان را فراهم می کند که متغیرهایی با نوع ناشناس یا به اصطلاح anonymous ایجاد کنیم. تمامی متغیرهای محلی را می توان با var اعلان کرد. گفتنی است که نوع آرایه را نیز می توان با var و به صورت ضمنی مشخص کرد.
ایجاد یک شی یا collection جدید با استفاده از Object/Collection Initializer
Object/Collection initializer این امکان را فراهم می کند که اشیا را بدون اینکه یک constructor به طور صریح برای آن صدا بزنید، مقداردهی اولیه نمایید. initializer ها به طور معمول برای این در عبارت های Query بکار می روند که داده های اصلی (source data) را داخل نوع جدیدی کپی کنند. فرض کنید کلاسی به نام Customer داریم. این کلاس property هایی با نام Name و Phone دارد. حال با استفاده از کلیدواژه ی new (و object initializer) یک شی جدید از کلاس Customer ایجاد می کنیم:
Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };
نوع های ناشناس (Anonymous Type)
نوع ناشناس توسط کامپایلر ایجاد شده و اسم آن نیز تنها در اختیار خود کامپایلر می باشد (برای خود کامپایلر مشخص می باشد). قابلیت تعریف (متغیر از) نوع ناشناس (anonymous type) یک روش آسان برای گروه بندی (و ذخیره ی) مجموعه ای از property ها به صورت موقتی در نتیجه ی کوئری و بدون نیاز به تعریف (متغیر با) نوع متفاوت برای ذخیره ی آن محسوب می شود. نوع های ناشناس به وسیله ی کلیدواژه ی new و یک object initializer تنظیم و مقداردهی اولیه می شوند:
select new {name = cust.Name, phone = cust.Phone};
زمانی که متغیری را با کلیدواژه ی var تعریف می کنید، در واقع یک متغیر با نوع نامشخص تعریف می کنید که وظیفه ی تشخیص نوع آن در زمان ترجمه به زبان ماشین به عهده ی کامپایلر می باشد.
متدهای الحاقی/پسوندی (extension method)
Extension method توابع الحاقی هستند که به صورت static تعریف شده و دارای سطح دسترسی public می باشند. این توابع را می توان داخل کلاس دیگری (کلاس کمکی) تعریف کرده و سپس در کلاس اصلی به یک متغیر متصل کرد و عملیات تعریف شده در بدنه ی تابع در کلاس کمکی را بر روی آن انجام داد. این امکان که در ویرایش 3.0 زبان C# ارائه شد، در عمل به شما اجازه می دهد متدهای جدید به متدهای جاری کلاس خود، بدون نیاز به ویرایش کلاس اصلی، اضافه کنید. عملگرهای متعارف زبان SQL نیز می توانند به عنوان متدهای الحاقی ایفای نقش کنند که قابلیت کوئری LINQ را برای هر نوعی که رابط IEnumerable<T> را پیاده سازی می کند، فراهم می نماید.
عبارت های Lambda
عبارت های lambda توابع درون خطی (inline) هستند که از عملگر => (نتیجه می دهد) را برای جداسازی پارامترهای ورودی از بدنه ی تابع استفاده کرده و در زمان کامپایل به یک delegate یا expression tree (کد با ساختار درختی) تبدیل می شوند. در کدنویسی LINQ زمانی با عبارت های lambda مواجه می شوید که بخواهید عملگرهای SQL که به صورت متد (الحاقی) بکار گرفته شده اند را به طور مستقیم فراخوانی کنید.
Property هایی که به صورت خودکار پیاده سازی می شوند (Auto-Implemented Properties)
Property هایی که به صورت خودکار پیاده سازی می شوند، در واقع اعلان property را به طور نسبی مختصر می سازد. زمانی که شما یک property را به صورت نمایش داده شده در نمونه ی زیر تعریف می کنید، کامپایلر اقدام به ایجاد یک فیلد anonymous با سطح دسترسی private می کند که مگر از طریق (توابع بازیابی و تنظیم مقدار) getter و setter، قابل دسترسی نخواهد بود.
public string Name {get;set;}